﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RepositorioSATT;
using DominioSATT;

namespace ServiceSATT
{
    public class AfiliadoCategoriaService : IAfiliadoCategoriaService
    {
        IAfiliadoCategoriaRepositorio Repositorio;
        #region Miembros de IAfiliadoCategoriaService

        public void Agregar(IInterfazPersona ui)
        {
            Repositorio = new AfiliadoCategoriaRepositorio();
            IPersonaRepositorio repoPersona = new PersonaRepositorio();
            Persona bPersona = repoPersona.Obtener(ui.Dni);
            ICategoriaRepositorio repoCategoria = new CategoriaRepositorio();
            int Edad = bPersona.CalcularEdad();
            Categoria bCategoria = repoCategoria.ObtenerPorEdad(Edad);
            if (bCategoria == null)
                throw new ServicioExeption("No existe ninguna categoria para la edad de: " + Edad + " años.");
            AfiliadoCategoria bAfiliadoCategoria = Repositorio.Buscar(ui.Dni, bCategoria.Id);
            if (bAfiliadoCategoria == null)
            {
                AfiliadoCategoria nAfiliadoCategoria = new AfiliadoCategoria(bPersona, bCategoria, 0, 0, true);
                Repositorio.Agregar(nAfiliadoCategoria);
            }
        }

        public void Actualizar(IInterfazAfiliadoCategoria ui)
        {
            Repositorio = new AfiliadoCategoriaRepositorio();
            IPersonaRepositorio repoPersona = new PersonaRepositorio();
            Persona bPersona = repoPersona.Obtener(ui.Dni);
            ICategoriaRepositorio repoCategoria = new CategoriaRepositorio();
            int Edad = bPersona.CalcularEdad();
            Categoria bCategoria = repoCategoria.ObtenerPorEdad(Edad);
            AfiliadoCategoria bAfiliadoCategoria = Repositorio.Buscar(ui.Dni, bCategoria.Id);
            if (bAfiliadoCategoria != null)
            {
                AfiliadoCategoria nAfiliadoCategoria = new AfiliadoCategoria(bPersona, bCategoria, 0, 0, true);
                Repositorio.Agregar(nAfiliadoCategoria);
            }
        }

        public void Buscar(IInterfazAfiliadoCategoria ui)
        {
            Repositorio = new AfiliadoCategoriaRepositorio();
            IPersonaRepositorio repoPersona = new PersonaRepositorio();
            Persona bPersona = repoPersona.Obtener(ui.Dni);
            ICategoriaRepositorio repoCategoria = new CategoriaRepositorio();
            int Edad = bPersona.CalcularEdad();
            Categoria bCategoria = repoCategoria.ObtenerPorEdad(Edad);
            AfiliadoCategoria bAfiliadoCategoria = Repositorio.Buscar(ui.Dni, bCategoria.Id);
            if (bAfiliadoCategoria != null)
            {
                ui.PartidosGanados = bAfiliadoCategoria.PartidosGanados;
                ui.PartidosPerdidos = bAfiliadoCategoria.PartidosPerdidos;
                ui.PartidosJugados = bAfiliadoCategoria.PartidosGanados + bAfiliadoCategoria.PartidosPerdidos;
                ui.Estado = bAfiliadoCategoria.Estado;
            }
        }

        public void Listar(IListadoAfiliadoCategoria ui)
        {
            int Puntos = 0;
            Repositorio = new AfiliadoCategoriaRepositorio();
            ICategoriaRepositorio repoCategoria = new CategoriaRepositorio();
            int IdCategoria = repoCategoria.ObtenerId(ui.Categoria);
            List<AfiliadoCategoria> ListaHistorial = Repositorio.Listar(IdCategoria);
            string[][] Lista = new string[ListaHistorial.Count][];
            if (ListaHistorial.Count > 0)
            {
                int i = 0;
                IInscripcionRepositorio RepoInscripcion = new InscripcionRepositorio();
                foreach (AfiliadoCategoria Objeto in ListaHistorial)
                {

                    RepoInscripcion.ListarPorJugador(Objeto.Afiliado.Dni);
                    Lista[i] = new string[] { (i + 1).ToString(), Objeto.Afiliado.Dni.ToString(), Objeto.Afiliado.Apellido + " " + Objeto.Afiliado.Nombre, 
                    Objeto.Afiliado.FechaNac.ToShortDateString(), Objeto.PartidosGanados.ToString(), Objeto.PartidosPerdidos.ToString(), 
                    Objeto.PartidosJugados.ToString(), Puntos.ToString()};
                    i++;
                }
            }
            ui.Lista = Lista;
        }

        public bool ValidarExistencia(int Dni)
        {
            Repositorio = new AfiliadoCategoriaRepositorio();
            IPersonaRepositorio repoPersona = new PersonaRepositorio();
            Persona bPersona = repoPersona.Obtener(Dni);
            ICategoriaRepositorio repoCategoria = new CategoriaRepositorio();
            int Edad = bPersona.CalcularEdad();
            Categoria bCategoria = repoCategoria.ObtenerPorEdad(Edad);
            if (bCategoria == null)
                return false;
            else
                return true;
        }

        #endregion
    }
}
